from functools import wraps
from flask import request, jsonify, g, current_app
from applications.models.frontend import User
from applications.view.system.auth import decode_jwt


def miniapp_login_required(f):
    """
    小程序登录验证装饰器
    :param f: 被装饰的函数
    :return: 装饰后的函数
    """
    @wraps(f)
    def decorated(*args, **kwargs):
        # 获取token
        token = request.headers.get('Authorization') or request.headers.get('token')
        print('小程序登录验证：', token)
        if not token:
            return jsonify({'code': 403, 'message': '请先登录'}), 403
            
        # 解析token
        try:
            # 实际项目中应该使用JWT库验证token
            user_id = decode_jwt(token)
            
            # 查询用户
            user = User.query.filter_by(id=user_id, enable=1).first()
            print('小程序登录验证用户：', user)
            if not user:
                return jsonify({'code': 401, 'message': '用户不存在或已被禁用'}), 401
                
            # 将用户信息存储在g对象中，方便视图函数使用
            g.user = user
            
            return f(*args, **kwargs)
        except Exception as e:
            current_app.logger.error(f'验证登录失败: {str(e)}')
            return jsonify({'code': 401, 'message': '登录凭证已过期，请重新登录'}), 401
            
    return decorated
